package tests;


import static org.junit.Assert.assertTrue;

import java.math.BigDecimal;
import java.util.Date;
import java.util.LinkedList;
import java.util.Queue;

import org.junit.Before;
import org.junit.Test;

import ubicacionEnAvion.Ventana;
import usuario.Usuario;
import vuelo.VueloDirecto;
import aerolinea.Aerolinea;
import aerolinea.LanchitaAdapter;
import aerolinea.OceanicAdapter;
import aerolinea.TodasLasAerolineas;
import asiento.Asiento;
import asiento.Comprado;
import asiento.Disponible;
import asiento.Reservado;
import claseAsiento.Turista;

import com.lanchita.AerolineaLanchita;
import com.oceanic.AerolineaOceanic;

import excepciones.NoPuedeReservarException;

public class ReservaAsientoTest {

	Usuario usuario1;
	Usuario usuario2;
	Usuario usuario3;
	Asiento asientoDisponible;
	Asiento asientoReservado;
	Asiento asientoComprado;
	Queue<Usuario> reservas1;
	Queue<Usuario> reservas2;
	VueloDirecto vuelo;
	Aerolinea aerolinea;
	AerolineaLanchita lanchita;
	AerolineaOceanic oceanic;
	TodasLasAerolineas todasLasAerolineas;
	LanchitaAdapter lanchitaAdapter;
	OceanicAdapter oceanicAdapter;
	
	
	@Before
	public void setUp() throws Exception {
		
		usuario1 = new Usuario();
		usuario1.setDni("12345678");
		usuario2 = new Usuario();
		usuario2.setDni("87654321");

		asientoDisponible = new Asiento();
		asientoDisponible.setUbicacionEnAvion(new Ventana());
		asientoDisponible.setClaseAsiento(new Turista());
		asientoDisponible.setPrecio(new BigDecimal("3000"));
		asientoDisponible.setFechaLlegada(new Date());
		asientoDisponible.setFechaSalida(new Date());
		asientoDisponible.setCodigoAsiento("01202022220123-3");
		asientoDisponible.setEstado(new Disponible());
		reservas1 = new LinkedList<Usuario>();	
		
		asientoReservado = new Asiento();
		asientoReservado.setUbicacionEnAvion(new Ventana());
		asientoReservado.setClaseAsiento(new Turista());
		asientoReservado.setPrecio(new BigDecimal("3000"));
		asientoReservado.setFechaLlegada(new Date());
		asientoReservado.setFechaSalida(new Date());
		asientoReservado.setEstado(new Reservado());
		reservas2 = new LinkedList<Usuario>();		
		
		asientoComprado = new Asiento();
		asientoComprado.setEstado(new Comprado());
		
		lanchita = AerolineaLanchita.getInstance();
		oceanic = AerolineaOceanic.getInstance();

		lanchitaAdapter = new LanchitaAdapter();
		lanchitaAdapter.setInstance(lanchita);
		oceanicAdapter = new OceanicAdapter();
		oceanicAdapter.setInstance(oceanic);
		
		vuelo = new VueloDirecto("ECO344", asientoReservado);
		vuelo.setAerolinea(lanchitaAdapter);
		//vuelo.setAerolinea(oceanicAdapter);
		asientoDisponible.setVuelo(vuelo);
		asientoReservado.setVuelo(vuelo);		
		
	}
	

	@Test
	public void reservarAsientoDisponible() throws NoPuedeReservarException{
		asientoDisponible.reservar(usuario1);
		assertTrue(asientoDisponible.getEstado().getReservas().size()==1);
	}
	
	@Test
	public void sobreReservarAsiento() throws NoPuedeReservarException{
		asientoReservado.reservar(usuario1);
		asientoReservado.reservar(usuario2);
		assertTrue(asientoReservado.getEstado().getReservas().size()==2);
	}
	
	@Test
	public void intentarReservarAsientoComprado() throws NoPuedeReservarException{
		asientoComprado.reservar(usuario1);
		assertTrue(asientoComprado.getEstado().getReservas().size()==0);
	}
	
	@Test
	public void reservaVencida() throws NoPuedeReservarException{
		asientoReservado.setEstado(new Reservado());
		reservas1 = new LinkedList<Usuario>();
		asientoReservado.reservar(usuario1);
		assertTrue(asientoReservado.getEstado().getReservas().size()==1);
		asientoReservado.reservaVencida();
		assertTrue(asientoReservado.getEstado().getReservas().size()==0);
	}
	
}
